package com.lc1993929.mr.pv;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * Created by LiuChang on 2017/11/2/002.
 * <p>
 * KEYIN:是mapReduce提供的程序读取到一行数据的起始偏移量   Long
 * VALUEIN:是mapReduce提供的程序读取到一行数据的内容    String
 * <p>
 * KEYOUT:是用户的逻辑处理方法处理完成之后返回给框架的数据中key的类型（在本逻辑中，key是IP地址，类型是String）
 * VALUEOUT:是用户的逻辑处理方法处理完成之后返回给框架的数据中value的类型（在本逻辑中，key是用户访问的页面数，类型是Integer)
 * <p>
 * 注意：
 * Long、String、Integer等一类的java 类型不能在hadoop中直接使用，因为这些数据会被框架在机器和机器之间进行网络传送。
 * 也就是说，数据需要频繁的序列化和反序列化，而java原生的序列化和反序列化机制非常臃肿。所以hadoop开发了一个自己的序列化机制。
 * 那么，Long、String、Integer等类型都要替换成为hadoop中的实现了自己的序列化机制的类型：LongWritable，Text，IntWritable等
 */
public class PvMapper extends Mapper<LongWritable, Text, Text, IntWritable> {


    /**
     * mapReduce框架提供的程序每读一行数据就调用一次我们写的这个map()方法
     *
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        super.map(key, value, context);
        String line = value.toString();
        String[] split = line.split(" ");
        String ip = split[0];

        context.write(new Text(ip), new IntWritable(1));
    }
}
